package com.powernode.controller;

import com.powernode.entity.Goods;
import com.powernode.service.GoodsService;
import com.powernode.service.LuaService;
import com.powernode.vo.HttpResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.annotation.Resource;
import java.util.Objects;

/**
 * 秒杀接口
 */
@Slf4j
@Controller
@RequestMapping("/goods")
public class SeckillController {

    @Resource
    private GoodsService goodsService;

    @Resource
    private LuaService luaService;

    /**
     * 秒杀下单功能
     *
     * @param id
     * @param randomCode
     * @return
     */
    @PostMapping("/{id}/{random}")
    @ResponseBody
    public HttpResult seckill(@PathVariable(value = "id") Integer id,
                              @PathVariable(value = "random") String randomCode,
                              Integer userId) {
        log.info("秒杀下单功能 , 商品id 和 商品随机码分别是 : {} , {}", id, randomCode);
        // 根据商品id 查询商品数据
        Goods goods = goodsService.loadGoodsById(id);
        // 判断 商品随机码是否一致  --->  Objects.equals
        if (!Objects.equals(randomCode, goods.getRandomName())) {
            // 不相等
            return HttpResult.ERROR();
        }
        // 判断 秒杀是否开始 或 结束
        long currentTime = System.currentTimeMillis();
        long startTime = goods.getStartTime().getTime();
        long endTime = goods.getEndTime().getTime();
        if (currentTime < startTime) {
            // 秒杀还未开始呢
            return HttpResult.ERROR("秒杀还没有还是勒, 你别急 , 稍后再试");
        }
        if (currentTime > endTime) {
            return HttpResult.ERROR("你来晚了 , 秒杀已经结束 , good bay");
        }
        // 判断商品 库存是否足够
        if (goods.getStore() <= 0) {
            // 不够
            return HttpResult.ERROR("抢光啦 , 您来晚了, 拜拜了您乃");
        }

        // 用户是否参与秒杀 + 是否限流 +  库存是否足够 ==>  原子性执行
        // 自定义一个用户id
        Long lunScript = luaService.runLunScript(id, String.valueOf(userId));
        // 判断执行lua脚本返回结果
        String msg = "";
        if (lunScript == -1) {
            msg = "您都秒杀过了 , 咱不要太贪心";
        } else if (lunScript == -2) {
            msg = "你点背, 当前秒人太多, 被限流了";
        } else if (lunScript == -3) {
            msg = "尴尬了 , 被抢完了, 你手速真不行";
        } else {
            // 成功的情况 -- 判断条件结束 , 整合orders对象 , 向下继续进行下订单操作 , 传给rabbitmq中
            goodsService.sendOrdersMessage(goods , userId);
            return HttpResult.SUCCESS();
        }
        return HttpResult.ERROR(msg);
    }
/*    @PostMapping("/{id}/{random}")
    @ResponseBody
    public HttpResult seckill(@PathVariable(value = "id") Integer id,
                              @PathVariable(value = "random") String randomCode) {
        log.info("秒杀下单功能 , 商品id 和 商品随机码分别是 : {} , {}", id, randomCode);
        // 根据商品id 查询商品数据
        Goods goods = goodsService.loadGoodsById(id);
        // 判断 商品随机码是否一致  --->  Objects.equals
        if (!Objects.equals(randomCode, goods.getRandomName())) {
            // 不相等
            return HttpResult.ERROR();
        }
        // 判断 秒杀是否开始 或 结束
        long currentTime = System.currentTimeMillis();
        long startTime = goods.getStartTime().getTime();
        long endTime = goods.getEndTime().getTime();
        if (currentTime < startTime) {
            // 秒杀还未开始呢
            return HttpResult.ERROR("秒杀还没有还是勒, 你别急 , 稍后再试");
        }
        if (currentTime > endTime) {
            return HttpResult.ERROR("你来晚了 , 秒杀已经结束 , good bay");
        }
        // 判断商品 库存是否足够
        if (goods.getStore() <= 0) {
            // 不够
            return HttpResult.ERROR("抢光啦 , 您来晚了, 拜拜了您乃");
        }

        // 用户是否参与秒杀 + 是否限流 +  库存是否足够 ==>  原子性执行
        // 自定义一个用户id
        String userId = "1001";
        Long lunScript = luaService.runLunScript(id, userId);
        // 判断执行lua脚本返回结果
        String msg = "";
        if (lunScript == -1) {
            msg = "您都秒杀过了 , 咱不要太贪心";
        } else if (lunScript == -2) {
            msg = "你点背, 当前秒人太多, 被限流了";
        } else if (lunScript == -3) {
            msg = "尴尬了 , 被抢完了, 你手速真不行";
        } else {
            // 成功的情况 -- 判断条件结束 , 整合orders对象 , 向下继续进行下订单操作 , 传给rabbitmq中
            goodsService.sendOrdersMessage(goods , Integer.valueOf(userId));
            return HttpResult.SUCCESS();
        }
        return HttpResult.ERROR(msg);
    }*/
}
